package BehavioralPattern.Memento;

/**
 * @Classname : MementoClient
 * @Description : 测试 备忘录模式
 * 行为型——备忘录模式
 * 一、模式定义
 *   Without violating encapsulation, capture and externalize an object's internal state so that the objeet can be restored to this state later.
 *   在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
 * 二、模式类图
 *    https://kdocs.cn/l/caBBqgzspm7W
 * 三、适用场景
 *   1、当需要恢复数据状态时
 * 四、应用举例
 *   1、Word 中 ctrl+z撤回
 *   2、浏览器、文件管理器后退按钮
 *   3、监控场景，若对实时性要求不高，可备份主线程对象进行分析
 *
 * @Author : chentianyu
 * @Date 2023/3/8 21:47
 */


public class MementoClient {
    public static void main(String[] args) {
        System.out.println("------备忘录模式------");
        // 创建备忘录管理员
        Caretaker caretaker = new Caretaker();
        // 创建发起人
        Originator originator = new Originator();
        // 初始状态00
        originator.setState1("华夏");
        originator.setState2("国运");
        originator.setState3("昌盛");
        System.out.println("===初始状态00===");
        System.out.println(originator);
        // 备份状态00
        caretaker.setMemento("00", originator.createMemento());

        // 修改状态01
        originator.setState1("软件");
        originator.setState2("架构");
        originator.setState3("优秀");
        System.out.println("===修改状态01===");
        System.out.println(originator);
        // 备份状态01
        caretaker.setMemento("01", originator.createMemento());

        // 修改状态02
        originator.setState1("人民");
        originator.setState2("安居");
        originator.setState3("乐业");
        System.out.println("===修改状态02===");
        System.out.println(originator);
        // 备份状态02
        caretaker.setMemento("02", originator.createMemento());

        // 恢复状态00
        originator.restoreMemento(caretaker.getMemento("00"));
        System.out.println("===恢复状态00===");
        System.out.println(originator);

        // 恢复状态01
        originator.restoreMemento(caretaker.getMemento("01"));
        System.out.println("===恢复状态01===");
        System.out.println(originator);

        // 恢复状态02
        originator.restoreMemento(caretaker.getMemento("02"));
        System.out.println("===恢复状态02===");
        System.out.println(originator);
    }
}

/** 20230308
 * ------备忘录模式------
 * ===初始状态00===
 * Originator(state1=华夏, state2=国运, state3=昌盛)
 * ===修改状态01===
 * Originator(state1=软件, state2=架构, state3=优秀)
 * ===修改状态02===
 * Originator(state1=人民, state2=安居, state3=乐业)
 * ===恢复状态00===
 * Originator(state1=华夏, state2=国运, state3=昌盛)
 * ===恢复状态01===
 * Originator(state1=软件, state2=架构, state3=优秀)
 * ===恢复状态02===
 * Originator(state1=人民, state2=安居, state3=乐业)
 */
